package com.shujia

object Demo22Implicit1 {
  def main(args: Array[String]): Unit = {
    /**
      * 隐式转换：给对象动态增加方法
      * 1、隐式转换函数
      * 2、隐式转换变量
      * 3、隐式转换类
      */

    // 1、隐式转换函数
    // 在同一个作用域范围内 只能存在一个同类型（函数的参数类型跟返回值类型一样）的隐式转换函数
    def func1(i :Int):Int ={
      i+100
    }
    println(func1(10))
    println(func1(100))
    // func1需要的参数类型为Int，这里直接传入String 会报错
    // println(func1("100"))
    // 手动的将String转为Int传入func1
//    println(func1("100".toInt)) toInt也是一个隐式转换函数
    println(func1(Integer.parseInt("100")))

    // 定义一个隐式转换函数
    implicit def fun(str:String):Int = {
      Integer.parseInt(str)
    }
    // 手动调用
    println(func1(fun("100")))
    // 自动调用
    // func1需要Int类型的参数 而在这里只给了一个String类型的值
    // Scala编译的时候会去自动寻找一个隐式转换函数：参数类型为String，返回值类型为Int
    // 在作用域中找到隐式转换函数fun 符合条件
    // 那么就会自动调用隐式转换函数fun
    println(func1("200"))
  }
}
